/**
 * A gördülő, JuzKezt megölő sziklákat reprezentáló osztály.
 */
public class Boulder extends Entity
{
  private boolean falling = false;
  /**
   * Megmutatja, hogy le tud e gördülni egy gördülő entitás erről.
   * @return Mindig true
   */
  public boolean isRound()
  {
    return true;
  }

  /**
   *
   * @param direction
   * @param depth
   * @return
   */
  public boolean move(int direction, int depth)
  {
    field.getGame().getTimer().stop();
    field.getGame().setPlayerMoves(false);
    if(direction == 0)
    //ha 0 irányba hívták, az a "zuhanj, ha tudsz" felszólítás
    {
      boolean b = true;
      while (b)
      {
        Field neighbour = field.getNeighbour(5);
        if(neighbour != null)
        {        
          if(neighbour.isEmpty())  
          //ha nincs alatta semmi, odalép, és beállítja a zuhanás flaget 1-re
          {
            falling = true;
            field.delete();
            neighbour.add(this);
          }
          else
          //ha van, meg kell nézni zuhanunk-e már
          {
            if(falling)
            //ha igen, meg kell próbálni kinyírni ami alattunk van,
            //majd oda kell lépni
            {
              if (neighbour.getEntity().kill())
              {
                field.delete();
                neighbour.add(this);
              }
              else if (neighbour.getEntity().isRound())
              //ha nem sikerült kinyírni, le kell gördülni róla, amennyiben kerek
              {
                neighbour = field.getNeighbour(4);
                if (neighbour.isEmpty())
                //először próbáljuk meg jobbra
                {
                  field.delete();
                  neighbour.add(this);
                  //ha ráestünk valakire, dögöljön meg
                  Field temp = field.getNeighbour(5);
                  if (!temp.isEmpty())
                      temp.getEntity().kill();
                }
                else
                //ha jobbra nem volt üres mező, próbáljuk meg balra
                {
                  neighbour = field.getNeighbour(6);
                  if (neighbour.isEmpty())
                  {
                    field.delete();
                    neighbour.add(this);
                    //ha ráestünk valakire, dögöljön meg
                    Field temp = field.getNeighbour(5);
                    if (!temp.isEmpty())
                        temp.getEntity().kill();
                  }
                  else
                    b = false;
                }
              }
              else
                b = false;
            }
            //ha nem zuhanunk, akkor meg kell nézni kerek van-e alattunk
            else if (neighbour.getEntity().isRound())          
            {
              neighbour = field.getNeighbour(4);
              if (neighbour.isEmpty())
              //először próbáljuk meg jobbra
              {
                field.delete();
                neighbour.add(this);
                    //ha ráestünk valakire, dögöljön meg
                    Field temp = field.getNeighbour(5);
                    if (!temp.isEmpty())
                        temp.getEntity().kill();
              }
              else
              //ha jobbra nem volt üres mező, próbáljuk meg balra
              {
                neighbour = field.getNeighbour(6);
                if (neighbour.isEmpty())
                {
                  field.delete();
                  neighbour.add(this);
                    //ha ráestünk valakire, dögöljön meg
                    Field temp = field.getNeighbour(5);
                    if (!temp.isEmpty())
                        temp.getEntity().kill();
                }
                else
                  //cilus vége
                  b = false;
              }
            }
            else
              //cilus vége
              b = false;
          }
        }
      }
      falling = false;
    }
    else
    //nem 0 irányba meg kell próbálni mozogni
    {
      Field neighbour = field.getNeighbour(direction);
      if(neighbour != null)
      // ha a célmező létezik
      {
        if (depth > 0 && neighbour.isEmpty())
        //és üres, mozogjunk oda
        {
          field.delete();
          neighbour.add(this);
          if (direction != 2)
            move(0,0);
        }
        else
        //ha nem üres...
        {
          if(depth == 0)
          //de már nem tudunk tovább tolni, adjunk vissza false-t
          {
            field.getGame().getTimer().start();
            field.getGame().setPlayerMoves(true);
            callObservers();
            return false;
          }
          else
          //ha még tudjuk tolni, próbáljuk meg
          {
            if (neighbour.getEntity().move(direction, depth-1))
            //ha sikerült, lépjünk oda, és adjunk vissza true-t
            {
              field.delete();
              neighbour.add(this);
              if (direction != 2)
                move(0,0);

              field.getGame().getTimer().start();
              field.getGame().setPlayerMoves(true);
              callObservers();
              return true;
            }
            else
            //ha nem sikerült, adjunk vissza false-t
            {
              field.getGame().getTimer().start();
              field.getGame().setPlayerMoves(true);
              callObservers();
              return false;
            }
          }
        }
      }
    }
    //ha ideért a kód, már biztos nem zuhanunk, állítsuk vissza a flaget
    falling = false;

    callObservers();

    field.getGame().getTimer().start();
    field.getGame().setPlayerMoves(true);
    return true;
  }

  public String toString()
  {
    return "boulder["+ID+"]";
  }
}